/**
* \file		CompActuel.h
* \brief	Définit la structure CompActuel
* \details	C'est ici que sont définis la structure CompActuel, ses
*		accesseurs et ses mutateurs.
*/

#ifndef COMPACTUEL_H
#define COMPACTUEL_H

#include "TabComp.h"

/**
* \brief	Informations définissant un CompActuel
* \details	Cette structure, qui sert à stocker le comportement
*		actuellement appliqué par un nain donné, contiendra comme
*		informations un lien vers le comportement-type appliqué, et un
*		lien vers l'Action actuellement appliquée.
*/
typedef struct
{
   Comportement *comp;		/*!< Comportement actuellement appliqué : 
				pointeur sur Comportement */
   Action *actionActuelle;	/*!< Action en cours : pointeur sur Action */
} CompActuel;

/*======================== Gestion de la mémoire =======================*/
/**
* \brief	Initialise une structure CompActuel
* \details	Met à NULL tous les pointeurs
* \param	pcompAct	Pointeur vers le CompActuel à initialiser
*/
void initCompActuel(CompActuel *pcompAct);

/**
* \brief	Crée un CompActuel
* \details	Crée un CompActuel et l'initialise grâce à initCompActuel.
* \param	pcompAct	Pointeur sur l'adresse du CompActuel à créer
*/
void creerCompActuel(CompActuel **pcompAct);

/**
* \brief	Remet les champs du CompActuel donné à leur valeur initiale.
*		S'il y a lieu, libère la mémoire qui leur a été allouée.
* \details	Met à NULL tous les pointeurs
* \param	pcompAct	Pointeur vers le CompActuel à libérer
*/
void libereCompActuel(CompActuel *pcompAct);

/**
* \brief	Libère la mémoire allouée à un CompActuel donné
* \param	pcompAct	Pointeur vers le CompActuel à détruire
*/
void detruireCompActuel(CompActuel *pcompAct);


/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le pointeur sur Action du CompActuel donné
* \return	Un pointeur sur Action
* \param	pcompAct	Pointeur vers un CompActuel
*/
Action *getActionCompActuel(const CompActuel *pcompAct);

/**
* \brief	Retourne le pointeur sur Comportement du CompActuel donné
* \return	Un pointeur sur Comportement
* \param	pcompAct	Pointeur vers un CompActuel
*/
Comportement *getCompCompActuel(const CompActuel *pcompAct);

/**
* \brief	Retourne le nom du Comportement du CompActuel donné
* \return	Une chaîne de caractères
* \param	pcompAct	Pointeur vers un CompActuel
*/
char *getNomCompCompActuel(const CompActuel *pcompAct);


/*============================== Mutateurs =============================*/
/**
* \brief	Remplace le pointeur sur l'action en cours d'un CompActuel
*		donné par un pointeur passé en paramètre
* \param	pcompAct	Pointeur vers un CompActuel
* \param	nouvAct		Nouvelle action, pointeur vers Action
*/
void setActionCompActuel(CompActuel *pcompAct, Action *nouvAct);

/**
* \brief	Remplace le pointeur sur le comportement en cours d'un
*		CompActuel donné par un pointeur passé en paramètre et met le
*		pointeur sur action actuelle sur la première action du
*		comportement attribué
* \param	pcompAct	Pointeur vers un CompActuel
* \param	nouvComp	Nouveau comportement, pointeur vers
*				Comportement
*/
void setCompCompActuel(CompActuel *pcompAct, Comportement *nouvComp);

/**
* \brief	Remplace le pointeur sur le comportement en cours d'un
*		CompActuel dont on a passé le nom en paramètre et met le
*		pointeur sur action actuelle sur la première action du
*		comportement attribué
* \param	pcompAct	Pointeur vers un CompActuel
* \param	ptabComp	Tableau des comportements possibles
* \param	nomComp		Nouveau comportement, chaîne de caractères
*/
void setCompNomCompActuel(CompActuel *pcompAct, TabComp *ptabComp, char *nomComp);

/*========================== Fonctions autres ==========================*/
/**
* \brief	Fait passer l'action en cours à l'action suivante
* \param	pcompAct	Pointeur vers un CompActuel
*/
void passeActionSuivanteCompActuel(CompActuel *pcompAct);

/*===================== Jouer la fonction du champ =====================*/
/**
* \brief	Execute la fonction pointée par le champ pFAct de l'action en
*		cours
* \param	pcompAct	Pointeur vers un CompActuel
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente la Production
*				de la case
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void executeFonctionActionCompActuel(CompActuel *pcompAct, Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);

/*========================== Fonction de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module CompActuel
* \details	Teste les différentes fonctions du module CompActuel en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testCompActuel();

#endif
